package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.anno.Log;
import com.itheima.mapper.EmpExprMapper;
import com.itheima.mapper.EmpLogMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.*;
import com.itheima.service.EmpLogService;
import com.itheima.service.EmpService;
import com.itheima.utils.JwtUtils;
import org.apache.ibatis.annotations.Lang;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.*;

@Service
public class EmpServiceimpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMapper empExprMapper;
    @Autowired
    private EmpLogService empLogService;

    @Override
    public PageBean selectPage(EmpQueryParam empQueryParam) {
        PageHelper.startPage(empQueryParam.getPage(), empQueryParam.getPageSize());
        List<Emp> emps = empMapper.selectPage(empQueryParam);
        Page<Emp> list = (Page<Emp>) emps;
        return new PageBean(list.getTotal(), list.getResult());
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    @Log
    public void saveEmp(Emp emp) {
        try {
            emp.setCreateTime(LocalDateTime.now());
            emp.setUpdateTime(LocalDateTime.now());
            empMapper.saveEmp(emp);
//            System.out.println(1/0);
            List<EmpExpr> exprList = emp.getExprList();
            if (exprList != null && exprList.size() > 0) {
                for (EmpExpr empExpr : exprList) {
                    empExpr.setEmpId(emp.getId());
                }

                empExprMapper.add(exprList);
            }
        } finally {
            EmpLog empLog = new EmpLog();
            empLog.setOperateTime(LocalDateTime.now());
            empLog.setInfo("新增信息" + emp);
            empLogService.insertLog(empLog);
        }
    }

    @Override
    public List<Emp> selectAll() {
        return empMapper.selectAll();
    }

    //批量删除
    @Override
    @Log
    public void deleteByIds(List<Integer> ids) {
        //先删除员工信息表信息
        empMapper.deleteByIds(ids);
        //删除员工经历表信息 根据emp——id
        empExprMapper.deleteExprById(ids);

    }

    @Override
    public Emp selectById(Integer id) {
        //根据id查询员工基本信息
        Emp emp = empMapper.selectById(id);
        List<EmpExpr> list = empExprMapper.selectExprById(id);
        emp.setExprList(list);
        return emp;
    }

    @Transactional
    @Override
    @Log
    public void updateEmp(Emp emp) {
        //根据id修改员工基本信息
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.updateEmp(emp);

        Integer empId = emp.getId();
        List<EmpExpr> exprList = emp.getExprList();
        empExprMapper.deleteExprById(Arrays.asList(empId));
        if (exprList != null && exprList.size() > 0) {
            for (EmpExpr empExpr : exprList) {
                empExpr.setEmpId(emp.getId());
            }

            empExprMapper.add(exprList);

        }

//    @Override
//    //1:使用分页插件 开始介入分页操作
//    public PageBean selectPage(Integer page, Integer pageSize) {
//        PageHelper.startPage(page, pageSize);// page:页码  pageSize:每页显示条数
//        //2:执行sql语句  我们写了一条 分页插件会执行成两条
//        List<Emp> emps = empMapper.selectPage();
//        // 底层的集合是Page对象
//        // List-的儿子-ArrayList-的儿子-Page
//        Page<Emp> p = (Page<Emp>) emps;
//        //p是 ArrayList子类  其实也是 分页插件中 封装结果数据的对象
//        // 总条数   当前页的数据 都会在p中  获取总条数 getTotal()  获取当前页数据  getResult()
//        return new PageBean(p.getTotal(),p.getResult());
//    }


//    @Override
//    public PageBean selectPage(Integer page, Integer pageSize) {
//        long total= empMapper.count();
//        Integer start = (page-1)*pageSize;
//        List<Emp> list = empMapper.selectpage(start,pageSize);
//        return new PageBean(total, list);
//    }
    }

    @Override
    public LoginInfo login(Emp emp) {
        // empLoginInfo 根据用户名和密码 去数据库查询出来的用户对象
        Emp empLoginInfo = empMapper.Login(emp);
        // 如果 empLogin 不为空  说明用户名密码正
        if(empLoginInfo!=null){
            //获取jwt令牌
            Map<String,Object> map = new HashMap<>();//有效载荷对象
            map.put("id",empLoginInfo.getId());//存id
            map.put("username",empLoginInfo.getUsername());//用户名
            String s = JwtUtils.generateJwt(map);//调用jwt工具类生成jwt令牌方法 把有效载荷传进去

            return new LoginInfo(empLoginInfo.getId(), empLoginInfo.getUsername(), empLoginInfo.getPassword(), s);
        }else {
            return null;
        }

    }
}
